#include "mode_front_handle.h"
/*前灯带逻辑处理函数*/

ST_SYS gs_front_sys;
void front_power_off(SYS_OPT_KEY opt);
void front_logo(SYS_OPT_KEY opt);
void front_mode_1(SYS_OPT_KEY opt);
void front_mode_2(SYS_OPT_KEY opt);
void front_mode_3(SYS_OPT_KEY opt);
void front_mode_4(SYS_OPT_KEY opt);
void front_mode_5(SYS_OPT_KEY opt);

light_MODE front_mode_handle[NUM_SYS_SSP]=
{
    {front_power_off},
    {front_logo},
    {front_mode_1},
    {front_mode_2},
    {front_mode_3},
    {front_mode_4},
    {front_mode_5},
};

EM_SYS_SSP app_logic_get_front_recover_ssp()
{
    return gs_front_sys.recssp;
}

void app_logic_set_front_recover_ssp(EM_SYS_SSP ssp)
{
    if(ssp < NUM_SYS_SSP)
    {
        gs_front_sys.recssp =ssp;
    }
    LOG_INFO("set front recssp %d\n",ssp);
}

EM_SYS_SSP app_logic_get_front_last_ssp()
{
    return gs_front_sys.lastssp;
}

void app_logic_set_front_last_ssp(EM_SYS_SSP ssp)
{
    if(ssp < NUM_SYS_SSP)
    {
        gs_front_sys.lastssp =ssp;
    }
    LOG_INFO("set front lastssp %d\n",ssp);
}

EM_SYS_SSP app_logic_get_front_ssp()
{
    return gs_front_sys.ssp;
}

void app_logic_set_front_ssp(EM_SYS_SSP ssp)
{
    if(ssp < NUM_SYS_SSP)
    {
        gs_front_sys.ssp =ssp;
    }
    LOG_INFO("set front ssp %d\n",ssp);
}

void light2_function_ws2812(u8 port,u16 length)
{
    spi_send_param *spi_param = NULL;
    u8 *uart_rx_buffer = NULL;
    spi_param =(spi_send_param *)pvPortMalloc(sizeof(spi_send_param *));
    if (spi_param == NULL)
    {
        LOG_ERROR("pvPortMalloc create err\n");
        return;
    }
    uart_rx_buffer = (u8 *)pvPortMalloc(sizeof(u8 *)*(length*3));

    if(uart_rx_buffer == NULL)
    {
        LOG_ERROR("pvPortMalloc create err\n");
        return;
    }

    bzero(uart_rx_buffer,length*3);
    spi_param->send_len = length*3; //待发送数据长度
    spi_param->send_port = port; //待发送数据指定的灯带
    spi_param->send_data = uart_rx_buffer; //待发送的数据具体内容
    logic_send_light_msg(spi_param);
    uart_rx_buffer =NULL; //防止野指针
    spi_param = NULL;
}



void front_power_off(SYS_OPT_KEY opt)
{
    if(app_logic_get_front_last_ssp() != app_logic_get_front_ssp())//如果是第一次进入
    {
        if(app_logic_get_front_last_ssp() != SSP_LOGO) //恢复程序
        {
            app_logic_set_front_recover_ssp(app_logic_get_front_last_ssp()); //将上一次的状态保存
        }
        else
        {
            app_logic_set_front_recover_ssp(SSP_MODE_1);
        }
        app_logic_set_front_last_ssp(app_logic_get_front_ssp()); //将上次的状态与本次的状态同步
        disp_clear_light_front();
    }

    if (opt.target == MODE_FRONT)
    {
        if (opt.oepation == OPT_POWER_TURNON) ///开机操作
        {
            app_logic_set_front_ssp(app_logic_get_front_recover_ssp());
        }
    }
}

void front_logo(SYS_OPT_KEY opt)
{


}

/*黄光效果*/
void front_mode_1(SYS_OPT_KEY opt)
{
    if(app_logic_get_front_last_ssp() != app_logic_get_front_ssp())//如果是第一次进入
    {
        app_logic_set_front_last_ssp(app_logic_get_front_ssp()); //将上次的状态与本次的状态同步
        disp_clear_light_front(); // 清空前灯带的颜色
        
    }
    light_yellow_ws2812(FRONT_PORT,FRONT_LIGHT);
    if (opt.target == MODE_FRONT)
    {
        if (opt.oepation == OPT_GO_NEXT)
        {
            app_logic_set_front_ssp(SSP_MODE_2);
        }
        else if(opt.oepation == OPT_POWER_TURNOFF)
        {
            app_logic_set_front_ssp(SSP_POWER_OFF);
        }
    }
}

/*绿光效果*/
void front_mode_2(SYS_OPT_KEY opt)
{
    if(app_logic_get_front_last_ssp() != app_logic_get_front_ssp())//如果是第一次进入
    {
        app_logic_set_front_last_ssp(app_logic_get_front_ssp()); //将上次的状态与本次的状态同步
        disp_clear_light_front(); // 清空前灯带的颜色
        
    }
    light_green_ws2812(FRONT_PORT,FRONT_LIGHT);
    if (opt.target == MODE_FRONT)
    {
        if (opt.oepation == OPT_GO_NEXT) //下一个
        {
            app_logic_set_front_ssp(SSP_MODE_3);
        }
        else if(opt.oepation == OPT_POWER_TURNOFF) //关机
        {
            app_logic_set_front_ssp(SSP_POWER_OFF);
        }
    }
}

/*红光效果*/
void front_mode_3(SYS_OPT_KEY opt)
{
    if(app_logic_get_front_last_ssp() != app_logic_get_front_ssp())//如果是第一次进入
    {
        app_logic_set_front_last_ssp(app_logic_get_front_ssp()); //将上次的状态与本次的状态同步
        disp_clear_light_front(); // 清空前灯带的颜色
        
    }
    light_red_ws2812(FRONT_PORT,FRONT_LIGHT);
    if (opt.target == MODE_FRONT)
    {
        if (opt.oepation == OPT_GO_NEXT) //下一个
        {
            app_logic_set_front_ssp(SSP_MODE_4);
        }
        else if(opt.oepation == OPT_POWER_TURNOFF) //关机
        {
            app_logic_set_front_ssp(SSP_POWER_OFF);
        }
    }
}

/*蓝光效果*/
void front_mode_4(SYS_OPT_KEY opt)
{
    if(app_logic_get_front_last_ssp() != app_logic_get_front_ssp())//如果是第一次进入
    {
        app_logic_set_front_last_ssp(app_logic_get_front_ssp()); //将上次的状态与本次的状态同步
        disp_clear_light_front(); // 清空前灯带的颜色
    }
    light_blue_ws2812(FRONT_PORT,FRONT_LIGHT);
    if (opt.target == MODE_FRONT)
    {
        if (opt.oepation == OPT_GO_NEXT) //下一个
        {
            app_logic_set_front_ssp(SSP_MODE_5); //7彩还没做好，暂时随遍写一个
        }
        else if(opt.oepation == OPT_POWER_TURNOFF) //关机
        {
            app_logic_set_front_ssp(SSP_POWER_OFF);
        }
    }


}

static void light_rainbow_ws2812(u8 port,u16 length,u8 clear)
{   
    static u16 j =0;
    static u16 q = 0;
    u8 buf[FRONT_LIGHT*3/3];

    if (clear == 1)
    {
        j=0;
        q=0;
    }

    q++;
    if(q > 2)
    {
        spi_send_param *spi_param = NULL;
        u8 *uart_rx_buffer = NULL;
        spi_param =(spi_send_param *)pvPortMalloc(sizeof(spi_send_param *));
        if (spi_param == NULL)
        {
            LOG_ERROR("pvPortMalloc create err\n");
            return;
        }
        uart_rx_buffer = (u8 *)pvPortMalloc(sizeof(u8 *)*(length*3));
        if(uart_rx_buffer == NULL)
        {
            LOG_ERROR("pvPortMalloc create err\n");
            return;
        }
        bzero(uart_rx_buffer,length*3);
        spi_param->send_len = length*3; //待发送数据长度
        spi_param->send_port = port; //待发送数据指定的灯带

        for (uint16_t i=0; i < length*3/3; i=i+3) 
        {
            ws281x_set_pixel_color(i, ws281x_wheel((i+j)%255),length*3/3,buf);    //turn every third pixel on
        }

        for (size_t i = 0; i < FRONT_LIGHT/3; i++)
        {
            uart_rx_buffer[3*3*i+0] = buf[3*i+0];
            uart_rx_buffer[3*3*i+1] = buf[3*i+1];
            uart_rx_buffer[3*3*i+2] = buf[3*i+2];
            uart_rx_buffer[3*3*i+3] = buf[3*i+0];
            uart_rx_buffer[3*3*i+4] = buf[3*i+1];
            uart_rx_buffer[3*3*i+5] = buf[3*i+2];
            uart_rx_buffer[3*3*i+6] = buf[3*i+0];
            uart_rx_buffer[3*3*i+7] = buf[3*i+1];
            uart_rx_buffer[3*3*i+8] = buf[3*i+2];
        }
        



        spi_param->send_data = uart_rx_buffer; //待发送的数据具体内容
        logic_send_light_msg(spi_param);
        uart_rx_buffer =NULL; //防止野指针
        spi_param = NULL;

        q=0;
        j=j+2;
    }
    
    if(j > 256)
    {
        j=0;
    }

}



void front_mode_5(SYS_OPT_KEY opt)
{
    static u8 clear =0;
    if(app_logic_get_front_last_ssp() != app_logic_get_front_ssp())//如果是第一次进入
    {
        app_logic_set_front_last_ssp(app_logic_get_front_ssp()); //将上次的状态与本次的状态同步
        disp_clear_light_front(); // 清空前灯带的颜色
        clear =1;
    }
    
    if(clear == 1)
    {
        light_rainbow_ws2812(FRONT_PORT,FRONT_LIGHT,clear);
        clear = 0;
    }
    else
    {
        light_rainbow_ws2812(FRONT_PORT,FRONT_LIGHT,clear);
    }
    
    if (opt.target == MODE_FRONT)
    {
        if (opt.oepation == OPT_GO_NEXT) //下一个
        {
            app_logic_set_front_ssp(SSP_MODE_1);
        }
        else if(opt.oepation == OPT_POWER_TURNOFF) //关机
        {
            app_logic_set_front_ssp(SSP_POWER_OFF);
        }
    }

}

void mode_front_handle(SYS_OPT_KEY opt)
{
    if(front_mode_handle[app_logic_get_front_ssp()].handle)
    {
        front_mode_handle[app_logic_get_front_ssp()].handle(opt);
    }
    else
    {
        LOG_ERROR("front cur ssp handle is not defined\n");
    }
}






SYS_OPT_KEY front_on_off_opt(EM_DRV_ACT key_act)
{
    SYS_OPT_KEY opt;
    if (key_act == DRV_ACT_KEY_SHORT)
    {
        if(app_logic_get_front_ssp() == SSP_POWER_OFF) //判断当前状态
        {
            opt.oepation = OPT_POWER_TURNON; //开机
            opt.target = MODE_FRONT;
        }
        else
        {
            opt.oepation = OPT_INVALID; //无效操作
            opt.target = MODE_FRONT;
        }
    }
    else if(key_act == DRV_ACT_KEY_2S)
    {
        if(app_logic_get_front_ssp() != SSP_POWER_OFF) //判断当前状态
        {
            opt.oepation = OPT_POWER_TURNOFF; //关机
            opt.target = MODE_FRONT;
        }
        else
        {
            opt.oepation = OPT_INVALID; //无效操作
            opt.target = MODE_FRONT;
        }
    }
    
    return opt;

}

SYS_OPT_KEY front_mode_opt(EM_DRV_ACT key_act)
{
    SYS_OPT_KEY opt;
    if (key_act == DRV_ACT_KEY_SHORT)
    {
        if(app_logic_get_front_ssp() != SSP_POWER_OFF)
        {
            opt.oepation = OPT_GO_NEXT; //下一步
            opt.target = MODE_FRONT;
        }
        else
        {
            opt.oepation = OPT_INVALID; //无效操作
            opt.target = MODE_FRONT;
        }
    }
    else if(key_act == DRV_ACT_KEY_2S)
    {
        opt.oepation = OPT_INVALID; //无效操作
        opt.target = MODE_FRONT;
    }
    
    return opt;

}

